﻿Imports System.Data
Imports System.Text
Imports System.IO
Imports System.Collections.ObjectModel

Public Class CSGeneralCupones

    Private ENCABEZADO As String
    Private RUTA As String
    Private NOMBREARCHIVO As String
    Private COMANDO As String
    Private PARAMETROS As String
    Private PARAMETROSBATCH As String

    Private listVector As List(Of CTConciliaCupones)
    Private listaVectorEv As List(Of CTConciliaCupones)
    Private listaVectorTotal As List(Of CTConciliaCupones)
    Private listaEventos As List(Of CTConciliaCupones)
    Private listaPosicion As List(Of CTConciliaCupones)

    'Evento = Instrumentom, tipo, factor
    'Posicion = Intrumento
    'Vector = Instrumento, tipo
    Public Sub New()

        Dim servGrales As New CServiciosGenerales()
        RUTA = CServicioLocalSQLServerDB.ObtenerRutaArchivoLoadInstrument()
        COMANDO = CServicioLocalSQLServerDB.ObtenerNombreComandoTLoderLoadInstrument()
        PARAMETROS = CServicioLocalSQLServerDB.ObtenerParamComandoTLoderLoadInstrument()
        NOMBREARCHIVO = servGrales.ObtenerPREFIJOARCHIVO & CServicioLocalSQLServerDB.ObtenerNombreArchivoEventos()
        ENCABEZADO = CServicioLocalSQLServerDB.ObtenerEncabezadoEventos()
    End Sub

    Public Function ValidaExistenciaVector(ByVal fecha As Date, ByRef dt As DataTable) As Boolean
        Dim arreglo() As String
        Dim fechaFichero As Date
        Dim ruta As String = ""
        Dim tabla As String = ""

        CAccesoHTML.ObtenerRutaTabla(CAccesoHTML.TipoEmisora.VectorValmer, ruta, tabla)
        Dim archivo As String = My.Application.Info.DirectoryPath & "\temp_" & tabla & ".csv"

        If File.Exists(archivo) Then
            Using sw As StreamReader = My.Computer.FileSystem.OpenTextFileReader(archivo, System.Text.Encoding.Default)
                arreglo = sw.ReadLine().Split(",")
                arreglo = sw.ReadLine().Split(",")
                fechaFichero = DateTime.Parse(arreglo(1))

                sw.Close()
            End Using
            If fechaFichero.ToString("dd/MM/yyyy") = fecha.ToString("dd/MM/yyyy") Then
                dt = CAccesoHTML.LeeVector(archivo, tabla)
                Return True
            Else
                Return False
            End If

        Else
            Return False
        End If
    End Function

    Public Function ObtenerFechaValmer(ByVal fecha As Date) As Date
        Try
            Dim fechaValmer As Date
            Dim concilia As CTConciliaCupones
            listVector = New List(Of CTConciliaCupones)
            listaVectorEv = New List(Of CTConciliaCupones)
            listaVectorTotal = New List(Of CTConciliaCupones)
            Dim dt As DataTable = New DataTable()
            If Not ValidaExistenciaVector(fecha, dt) Then
                dt = CAccesoHTML.ObtenerDatosPorTipoEmisora(fecha, CAccesoHTML.TipoEmisora.VectorValmer)
            End If

            If dt IsNot Nothing Then
                For Each dr As DataRow In dt.Rows
                    If Convert.ToString(dr(0)).Equals("MD") Or Convert.ToString(dr(0)).Equals("ED") Then
                        fechaValmer = Convert.ToDateTime(dr(1))
                        concilia = New CTConciliaCupones()
                        concilia.Instrumento = Convert.ToString(dr(22))
                        listVector.Add(concilia)
                    End If
                Next
            End If
            Return fechaValmer
        Catch ex As Exception
            Throw ex
        End Try
    End Function

    Public Sub ObtenerDatosValmer(ByVal fechaConciliacion As Date, ByVal fechaEventos As Date)
        Try

            Dim dt As DataTable
            Dim exx As Exception

            dt = CAccesoHTML.ObtenerDatosPorTipoEmisora(fechaConciliacion, CAccesoHTML.TipoEmisora.Corporativo)
            If dt IsNot Nothing Then
                AgregaEventos(dt, listVector, fechaEventos, CAccesoHTML.TipoEmisora.Corporativo)
            Else
                exx = New Exception("No existen datos para el vector con instrumentos Corporativos.")
                Throw exx
            End If

            dt = CAccesoHTML.ObtenerDatosPorTipoEmisora(fechaConciliacion, CAccesoHTML.TipoEmisora.Gubernamental)
            If dt IsNot Nothing Then
                AgregaEventos(dt, listVector, fechaEventos, CAccesoHTML.TipoEmisora.Gubernamental)
            Else
                exx = New Exception("No existen datos para el vector con instrumentos Gubernamentales.")
                Throw exx
            End If
            dt = CAccesoHTML.ObtenerDatosPorTipoEmisora(fechaConciliacion, CAccesoHTML.TipoEmisora.Bancario)
            If dt IsNot Nothing Then
                AgregaEventos(dt, listVector, fechaEventos, CAccesoHTML.TipoEmisora.Bancario)
            Else
                exx = New Exception("No existen datos para el vector con instrumentos Bancarios.")
                Throw exx
            End If
            dt = CAccesoHTML.ObtenerDatosPorTipoEmisora(fechaConciliacion, CAccesoHTML.TipoEmisora.Notas)
            If dt IsNot Nothing Then
                AgregaEventos(dt, listVector, fechaEventos, CAccesoHTML.TipoEmisora.Notas)
            Else
                exx = New Exception("No existen datos para el vector con instrumentos Notas.")
                Throw exx
            End If
            dt = CAccesoHTML.ObtenerDatosPorTipoEmisora(fechaConciliacion, CAccesoHTML.TipoEmisora.Eurobonos)
            If dt IsNot Nothing Then
                AgregaEventos(dt, listVector, fechaEventos, CAccesoHTML.TipoEmisora.Eurobonos)
            Else
                exx = New Exception("No existen datos para el vector con instrumentos Eurobonos.")
                Throw exx
            End If
        Catch ex As Exception
            Throw ex
        End Try


    End Sub

    Public Sub AgregaEventos(ByRef dt As DataTable, ByRef listVector As List(Of CTConciliaCupones), ByVal fecha As Date, ByVal tipoEmisora As CAccesoHTML.TipoEmisora)
        Dim concilia As CTConciliaCupones
        Dim indexInst As Integer
        Dim indexTipo As Integer
        Dim indexFechaVencimiento As Integer
        Dim indexFechaCupon As Integer

        Select Case tipoEmisora

            Case CAccesoHTML.TipoEmisora.Corporativo
                indexInst = 0
                indexTipo = 4
                indexFechaVencimiento = 13
                indexFechaCupon = 23
            Case CAccesoHTML.TipoEmisora.Gubernamental
                indexInst = 0
                indexTipo = 4
                indexFechaVencimiento = 11
                indexFechaCupon = 21
            Case CAccesoHTML.TipoEmisora.Bancario
                indexInst = 0
                indexTipo = 4
                indexFechaVencimiento = 13
                indexFechaCupon = 23
            Case CAccesoHTML.TipoEmisora.Notas
                indexInst = 0
                indexTipo = -1
                indexFechaVencimiento = 13
                indexFechaCupon = 23
            Case CAccesoHTML.TipoEmisora.Eurobonos
                indexInst = 1
                indexTipo = 6
                indexFechaVencimiento = 11
                indexFechaCupon = 18
        End Select
        Dim fechaAux As Date
        For Each dr As DataRow In dt.Rows
            Dim inst As String = Convert.ToString(dr(indexInst))
            If listVector.Find(Function(x) x.Instrumento = inst) IsNot Nothing Then
                Try


                    If Convert.ToString(dr(indexFechaVencimiento)).Equals("") Then
                        fechaAux = New Date(1999, 1, 1)
                    Else
                        fechaAux = CType(dr(indexFechaVencimiento), Date)
                    End If
                    If fechaAux.ToString("dd/MM/yyyy").Equals(fecha.ToString("dd/MM/yyyy")) Then
                        concilia = New CTConciliaCupones()
                        concilia.Instrumento = Convert.ToString(dr(indexInst))
                        concilia.TipoInstrumentoValmer = ""
                        If indexTipo > -1 Then
                            concilia.TipoInstrumentoValmer = "FIJO"
                            If Convert.ToString(dr(indexTipo)).Contains("Floating") Then
                                concilia.TipoInstrumentoValmer = "FLOTANTE"
                            End If
                        End If
                        concilia.EvtTyp = "BONDRED"
                        listaVectorEv.Add(concilia)
                        listaVectorTotal.Add(concilia)
                    End If

                    If Convert.ToString(dr(indexFechaCupon)).Equals("") Then
                        fechaAux = New Date(1999, 1, 1)
                    Else
                        fechaAux = CType(dr(indexFechaCupon), Date)
                    End If

                    If fechaAux.ToString("dd/MM/yyyy").Equals(fecha.ToString("dd/MM/yyyy")) Then
                        concilia = New CTConciliaCupones()
                        concilia.Instrumento = Convert.ToString(dr(indexInst))
                        concilia.TipoInstrumentoValmer = ""
                        If indexTipo > -1 Then
                            concilia.TipoInstrumentoValmer = "FIJO"
                            If Convert.ToString(dr(indexTipo)).Contains("Floating") Then
                                concilia.TipoInstrumentoValmer = "FLOTANTE"
                            End If
                        End If
                        concilia.EvtTyp = "COUPAY"
                        listaVectorEv.Add(concilia)
                        listaVectorTotal.Add(concilia)
                    End If
                Catch ex As Exception

                End Try

            End If
        Next
    End Sub

    Public Sub ObtenerPosicion()
        Try
            listaPosicion = New List(Of CTConciliaCupones)
            Dim dtDatos As DataTable
            Dim c As CTConciliaCupones

            dtDatos = CFLServiciosMacrosSyBaseDB.ObtieneInstrumentosPosicion()


            If dtDatos.Rows.Count > 0 Then
                For Each dt As DataRow In dtDatos.Rows
                    c = New CTConciliaCupones()
                    With c
                        .Instrumento = Convert.ToString(dt("INSTRUMENTO"))
                        .InstNum = Convert.ToInt32(dt("INST_NUM"))
                    End With
                    listaPosicion.Add(c)
                    c = Nothing
                Next
            End If

        Catch ex As Exception
            Throw ex
        End Try
    End Sub

    Public Sub ObtenerEventos(ByVal fecha As Date)
        Try
            listaEventos = New List(Of CTConciliaCupones)
            Dim dtDatos As DataTable = CFLServiciosMacrosSyBaseDB.ObtieneInstrumentosEventos(fecha.ToString("yyyy-MM-dd"))
            Dim c As CTConciliaCupones

            If dtDatos.Rows.Count > 0 Then
                For Each dt As DataRow In dtDatos.Rows
                    c = New CTConciliaCupones()
                    With c
                        .InstNum = Convert.ToInt32(dt("INST_NUM"))
                        .Instrumento = Convert.ToString(dt("INSTRUMENTO"))
                        .EvtTyp = Convert.ToString(dt("EVT_TYP"))
                    End With
                    listaEventos.Add(c)
                    c = Nothing
                Next
            End If

        Catch ex As Exception
            Throw ex
        End Try
    End Sub

    Public Function ObtenerEventosDiv(ByVal fecha As Date, ByVal InstNum As Long) As CTConciliaCupones
        Try
            Dim evento As CTConciliaCupones = Nothing
            Dim dtDatos As DataTable = CFLServiciosMacrosSyBaseDB.ObtieneEventosDiv(fecha.ToString("yyyy-MM-dd"), InstNum)

            If dtDatos.Rows.Count > 0 Then
                evento = New CTConciliaCupones()
                For Each dt As DataRow In dtDatos.Rows
                    With evento
                        .EvtNum = Convert.ToInt32(dt("EVT_NUM"))
                        .FechaDecalog = Convert.ToDateTime(dt("EVT_DAT"))
                        .CurCod = Convert.ToString(dt("CUR_COD"))
                        .Factor = Convert.ToDouble(dt("UNIT_GROSS_AMT"))
                    End With

                Next
            End If
            Return evento
        Catch ex As Exception
            Throw ex
        End Try
    End Function

    Public Function ObtieneInstrumentos(ByRef listInst As List(Of CTConciliaCupones)) As List(Of CTConciliaCupones)
        Try
            Dim lista As List(Of CTConciliaCupones) = New List(Of CTConciliaCupones)
            If listInst.Count() > 0 Then
                Dim instrumentos As System.Text.StringBuilder = New System.Text.StringBuilder()
                For Each evento As CTConciliaCupones In listInst
                    instrumentos.Append("'" & evento.Instrumento & "',")
                Next
                Dim cadena = instrumentos.ToString().Substring(0, instrumentos.ToString().Length - 1)

                Dim dtDatos As DataTable = CFLServiciosMacrosSyBaseDB.ObtieneInstrumentos(cadena)
                Dim c As CTConciliaCupones

                If dtDatos.Rows.Count > 0 Then
                    For Each dt As DataRow In dtDatos.Rows
                        c = New CTConciliaCupones()
                        With c
                            .Instrumento = Convert.ToString(dt("INSTRUMENTO"))
                            .InstNum = Convert.ToInt32(dt("INST_NUM"))
                            .TipoInstrumento = Convert.ToString(dt("INST_C_FREE2"))
                        End With
                        lista.Add(c)
                        c = Nothing
                    Next
                End If
            End If

            Dim instrumento As String
            Dim found As List(Of CTConciliaCupones)
            For Each inst As CTConciliaCupones In lista
                instrumento = inst.Instrumento
                found = listaVectorTotal.FindAll(Function(x) x.Instrumento = instrumento)
                If found.Count() > 0 Then
                    inst.TipoInstrumentoValmer = found(0).TipoInstrumentoValmer
                End If
            Next
            Return lista
        Catch ex As Exception
            Throw ex
        End Try

    End Function

    Public Function ObtieneTipoInstrumentos(ByRef nomInstrumento As String) As String
        Try
            Dim tipoInstrumento As String = ""
            Dim cadena = "'" & nomInstrumento & "'"
            Dim dtDatos As DataTable = CFLServiciosMacrosSyBaseDB.ObtieneInstrumentos(cadena)


            If dtDatos.Rows.Count > 0 Then
                For Each dt As DataRow In dtDatos.Rows
                    tipoInstrumento = Convert.ToString(dt("INST_C_FREE2"))

                Next
            End If
            Return tipoInstrumento
        Catch ex As Exception
            Throw ex
        End Try

    End Function

    Public Function ObtieneConciliacion(ByVal fechaConciliacion As Date, ByVal fechaEventos As Date) As List(Of CTConciliaCupones)
        Try
            Dim lista As List(Of CTConciliaCupones) = New List(Of CTConciliaCupones)
            Dim listaConcilia As List(Of CTConciliaCupones) = New List(Of CTConciliaCupones)
            ObtenerDatosValmer(fechaConciliacion, fechaEventos)
            ObtenerPosicion()
            ObtenerEventos(fechaEventos)


            'Pos y Valmer y No Evt
            'Dim listaPosValmer As List(Of CTConciliaCupones) = New List(Of CTConciliaCupones)
            'For Each posicion As CTConciliaCupones In listaPosicion
            '    Dim inst As String = posicion.Instrumento
            '    Dim concilia = listaVectorEv.FindAll(Function(x) x.Instrumento = inst)
            '    If concilia.Count > 0 Then
            '        For Each con As CTConciliaCupones In concilia
            '            con.InstNum = posicion.InstNum
            '            listaPosValmer.Add(con)
            '        Next

            '    End If
            'Next

            For Each vector As CTConciliaCupones In listaVectorEv
                Dim inst As String = vector.Instrumento
                Dim evttyp As String = vector.EvtTyp
                Dim evento = listaEventos.Find(Function(x) x.Instrumento = inst And x.EvtTyp = evttyp)
                If evento Is Nothing Then
                    If evttyp.Equals("COUPAY") Then
                        vector.Tipo = "PAGO DE CUPON NO EXISTENTE"
                        vector.Origen = "VALMER"
                    End If
                    If evttyp.Equals("BONDRED") Then
                        vector.Tipo = "AMORTIZACION NO EXISTENTE"
                        vector.Origen = "VALMER"
                    End If
                    lista.Add(vector)
                End If
            Next

            'Evt y Valmer No, Evt demas
            For Each eventos As CTConciliaCupones In listaEventos
                Dim inst As String = eventos.Instrumento

                Dim evttyp As String = eventos.EvtTyp
                Dim vectorPos = listaVectorEv.Find(Function(x) x.Instrumento = inst And x.EvtTyp = evttyp)

                If vectorPos Is Nothing Then
                    If evttyp.Equals("COUPAY") Then
                        eventos.Tipo = "PAGO DE CUPON NO EXISTENTE VALMER"
                        eventos.Origen = "EVENTOS"
                    End If
                    If evttyp.Equals("BONDRED") Then
                        eventos.Tipo = "AMORTIZACION NO EXISTENTE VALMER"
                        eventos.Origen = "EVENTOS"
                    End If
                    'eventos.Tipo = "EVENTOS EXISTENTES PER VALMER NO" 'Preguntar
                    lista.Add(eventos)
                End If
            Next

            'Solo en Posición
            For Each concilia As CTConciliaCupones In lista
                Dim inst As String = concilia.Instrumento
                Dim evttyp As String = concilia.EvtTyp
                Dim vectorPos = listaPosicion.Find(Function(x) x.Instrumento = inst)
                If vectorPos IsNot Nothing Then
                    listaConcilia.Add(concilia)
                End If
            Next
            If listaConcilia.Count > 0 Then
                lista = ObtieneInstrumentos(listaConcilia)
            End If
            For Each concilia As CTConciliaCupones In listaConcilia
                Dim inst As String = concilia.Instrumento
                Dim decalog = lista.Find(Function(x) x.Instrumento = inst)
                If decalog IsNot Nothing Then
                    concilia.InstNum = decalog.InstNum
                End If
            Next


            Return listaConcilia
        Catch ex As Exception
            Throw ex
        End Try

    End Function

    Public Function ObtieneConciliacionRV(ByRef listaETF As List(Of String), ByRef listaSiBolsa As List(Of CTConciliaCupones), ByVal fechaCon As Date, ByVal posFlag As Boolean, ByVal etfFlag As Boolean) As List(Of CTConciliaCupones)
        Try
            Dim lista As List(Of CTConciliaCupones) = New List(Of CTConciliaCupones)

            Dim concilia As CTConciliaCupones
            Dim listaBolsa As List(Of CTConciliaCupones)
            listaBolsa = ObtieneInstrumentosPorEmisora(listaSiBolsa)
            ObtenerPosicion()
            Dim instrumento As String
            Dim sibolsa As CTConciliaCupones
            Dim posicion As CTConciliaCupones
            Dim arreglo As String()
            For Each bolsa As CTConciliaCupones In listaBolsa
                instrumento = bolsa.Instrumento
                arreglo = instrumento.Split("_")
                If arreglo.Length > 1 Then
                    instrumento = arreglo(1)
                End If
                sibolsa = listaSiBolsa.Find(Function(x) x.Emisora = instrumento)
                If sibolsa IsNot Nothing Then
                    bolsa.FechaPago = sibolsa.FechaPago
                    bolsa.FechaSugerida = sibolsa.FechaPago
                    bolsa.FechaExcupon = sibolsa.FechaExcupon
                    bolsa.TipoDerecho = sibolsa.TipoDerecho
                    bolsa.EvtTyp = sibolsa.EvtTyp
                End If

            Next
            Dim eventosDiv As CTConciliaCupones
            If listaPosicion.Count() > 0 And posFlag Then
                For Each bolsa As CTConciliaCupones In listaBolsa
                    instrumento = bolsa.Instrumento
                    posicion = listaPosicion.Find(Function(x) x.Instrumento = instrumento)
                    If posicion IsNot Nothing Then
                        concilia = New CTConciliaCupones()
                        concilia.InstNum = bolsa.InstNum
                        concilia.Instrumento = bolsa.Instrumento
                        concilia.FechaPago = bolsa.FechaPago
                        concilia.FechaSugerida = bolsa.FechaSugerida
                        concilia.FechaExcupon = bolsa.FechaExcupon
                        concilia.Mercado = "DECALOG"
                        concilia.CurCod = "MXN"
                        concilia.EvtTyp = bolsa.EvtTyp
                        concilia.TipoDerecho = bolsa.TipoDerecho
                        concilia.Factor = 0.0
                        If concilia.EvtTyp.Equals("DIVREC") Then
                            eventosDiv = ObtenerEventosDiv(fechaCon, bolsa.InstNum)
                            If eventosDiv IsNot Nothing Then
                                concilia.CurCod = eventosDiv.CurCod
                                concilia.EvtNum = eventosDiv.EvtNum
                                concilia.FechaDecalog = eventosDiv.FechaDecalog
                                concilia.Factor = eventosDiv.Factor
                            End If
                        End If

                        lista.Add(concilia)
                    End If
                Next
            End If
            Dim etf As String
            If listaETF.Count() > 0 And etfFlag Then
                For Each bolsa As CTConciliaCupones In listaBolsa
                    instrumento = bolsa.Instrumento
                    etf = listaETF.Find(Function(x) x = instrumento)
                    If etf IsNot Nothing Then
                        concilia = New CTConciliaCupones()
                        concilia.InstNum = bolsa.InstNum
                        concilia.Instrumento = bolsa.Instrumento
                        concilia.FechaPago = bolsa.FechaPago
                        concilia.FechaSugerida = bolsa.FechaSugerida
                        concilia.FechaExcupon = bolsa.FechaExcupon
                        concilia.Mercado = "ETF"
                        concilia.CurCod = "MXN"
                        concilia.EvtTyp = bolsa.EvtTyp
                        concilia.TipoDerecho = bolsa.TipoDerecho
                        concilia.Factor = 0.0
                        lista.Add(concilia)
                    End If
                Next
            End If

            Return lista
        Catch ex As Exception
            Throw ex
        End Try

    End Function

    Public Function ObtieneInstrumentosPorEmisora(ByRef listInst As List(Of CTConciliaCupones)) As List(Of CTConciliaCupones)
        Try
            Dim lista As List(Of CTConciliaCupones) = New List(Of CTConciliaCupones)
            Dim instrumentos As System.Text.StringBuilder = New System.Text.StringBuilder()
            For Each inst As CTConciliaCupones In listInst
                instrumentos.Append("'" & inst.Emisora & "',")
            Next
            Dim cadena = instrumentos.ToString().Substring(0, instrumentos.ToString().Length - 1)

            Dim dtDatos As DataTable = CFLServiciosMacrosSyBaseDB.ObtieneInstrumentosPorEmisora(cadena)
            Dim c As CTConciliaCupones

            If dtDatos.Rows.Count > 0 Then
                For Each dt As DataRow In dtDatos.Rows
                    c = New CTConciliaCupones()
                    With c
                        .Instrumento = Convert.ToString(dt("INSTRUMENTO"))
                        .InstNum = Convert.ToInt32(dt("INST_NUM"))
                    End With
                    lista.Add(c)
                    c = Nothing
                Next
            End If

            Return lista
        Catch ex As Exception
            Throw ex
        End Try

    End Function

#Region "CUPONES"
    Public Function Check(ByRef razonInstrumento As CRazonInstrumento, ByVal tipoInstrumento As String, ByVal numInstrumento As Integer, ByRef sMsgError As String) As Boolean

        Dim dtRazonInstrumeto As DataTable


        Try

            dtRazonInstrumeto = CServiciosMacrosSyBaseDB.ObtienerDatosCheck(numInstrumento)



            If dtRazonInstrumeto.Rows.Count = 1 Then

                If IsDBNull(dtRazonInstrumeto(0)("RECV_BASIS_FIXED")) Then
                    sMsgError = "El instrumento no tiene BASE en Decalog por favor cambie la BASE"
                    Return False
                    Exit Function
                End If

                If dtRazonInstrumeto(0)("RECV_BASIS_FIXED") = 0 Then
                    sMsgError = "El instrumento no tiene BASE en Decalog por favor cambie la BASE"
                    Return False
                    Exit Function
                End If



                If IsDBNull(dtRazonInstrumeto(0)("RECV_FREQ")) = True Then
                    sMsgError = "El instrumento no tiene FRECUENCIA en Decalog por favor cambie la FRECUENCIA"
                    Return False
                    Exit Function
                End If


                If Trim(dtRazonInstrumeto(0)("RECV_FREQ")) = "" Then
                    sMsgError = "El instrumento no tiene FRECUENCIA en Decalog por favor cambie la FRECUENCIA"
                    Return False
                    Exit Function
                End If


                If IsDBNull(dtRazonInstrumeto(0)("RATE_TYP")) = True Then
                    sMsgError = "El instrumento no tiene RATE TYPE en Decalog por favor cambie el RATE TYPE"
                    Return False
                    Exit Function
                End If

                If Trim(dtRazonInstrumeto(0)("RATE_TYP")) = "" Then
                    sMsgError = "El instrumento no tiene RATE TYPE en Decalog por favor cambie la RATE TYPE"
                    Return False
                    Exit Function
                End If



                If tipoInstrumento.IndexOf("FIJO") <> -1 And dtRazonInstrumeto(0)("RATE_TYP") <> "F" Then
                    sMsgError = "El instrumento según valmer es de tipo FIJO y en Decalog no esta dado de alta como tal por favor cambielo"
                    Return False
                    Exit Function
                End If



                If tipoInstrumento.IndexOf("FIJO") <> -1 And dtRazonInstrumeto(0)("RATE_TYP") <> "F" And IIF(ISDBNULL(dtRazonInstrumeto(0)("NOMINAL_RATE")), 0, dtRazonInstrumeto(0)("NOMINAL_RATE")) = 0 Then
                    sMsgError = "El instrumento según valmer es de tipo FIJO y en Decalog no tiene ninguna tasa dada de alta"
                    Return False
                    Exit Function
                End If






                If tipoInstrumento.IndexOf("FLOTANTE") <> -1 And Trim(dtRazonInstrumeto(0)("RATE_TYP")) <> "R" Then
                    sMsgError = "El instrumento segúnn valmer es de tipo FLOTANTE y en Decalog no esta dado de alta como tal, por favor cambielo"
                    Return False
                    Exit Function
                End If



                If tipoInstrumento.IndexOf("FLOTANTE") <> -1 And Trim(dtRazonInstrumeto(0)("RATE_TYP")) <> "R" And IIF(ISDBNULL(dtRazonInstrumeto(0)("RECV_IDX_COD")), 0, dtRazonInstrumeto(0)("RECV_IDX_COD")) = 0 Then
                    sMsgError = "El instrumento según valmer es de tipo FLOTANTE y no tiene en Decalog ningun índice asociado por favor entre uno"
                    Return False
                    Exit Function
                End If


                With razonInstrumento

                    .NominalRate = iif(IsDBNull(dtRazonInstrumeto(0)("NOMINAL_RATE")), 0, dtRazonInstrumeto(0)("NOMINAL_RATE"))
                    .RateTyp = iif(IsDBNull(dtRazonInstrumeto(0)("RATE_TYP")), "", dtRazonInstrumeto(0)("RATE_TYP"))
                    .RecvIdxCod = iif(IsDBNull(dtRazonInstrumeto(0)("RECV_IDX_COD")), 0, dtRazonInstrumeto(0)("RECV_IDX_COD"))
                    .RecvMarginAdd = iif(IsDBNull(dtRazonInstrumeto(0)("RECV_MARGIN_ADD")), 0, dtRazonInstrumeto(0)("RECV_MARGIN_ADD"))

                End With

                Return True

            Else

                sMsgError = "Existe más de un registro para el número de instrumento: " & numInstrumento
                Return False

            End If



        Catch ex As Exception

            sMsgError = ex.Message
            Return False

        End Try

    End Function

    Public Function ConstruirArchivoValmerDecalog(ByVal numInstrumento As Integer, ByRef flujos As List(Of CFlujoValmer), ByRef razones As CRazonInstrumento, ByVal moneda As String, ByRef NomArchivo As String, ByRef sMsgError As String) As Boolean
        'Funcion de compatibilidad 

        Dim respuesta As Boolean = False

        Try
            NomArchivo = NOMBREARCHIVO & "_" & numInstrumento & "_" & Date.Now.ToString("yyyyMMdd") & "_" & Date.Now.ToString("hhmmss")
            Using sw As StreamWriter = File.CreateText(RUTA & NomArchivo)
                sw.WriteLine(ENCABEZADO)
                respuesta = ConstruirArchivoValmerDecalog(sw, numInstrumento, flujos, razones, moneda, sMsgError)
                sw.Close()
            End Using

            Return respuesta

        Catch ex As Exception
            sMsgError = ex.Message
            Return respuesta
        End Try


    End Function

    Public Function ConstruirArchivoValmerDecalog(ByRef sw As StreamWriter, ByVal numInstrumento As Integer, ByRef flujos As List(Of CFlujoValmer), ByRef razones As CRazonInstrumento, ByVal moneda As String, ByRef sMsgError As String) As Boolean
        Dim CalcBgDates As String
        Dim fechaFlujo As String
        Dim fechaFlujoAux As Date

        Dim lineaInteres As String = ""
        Dim lineaReduccion As String = ""
        Dim lineaRedem As String = ""

        Try




            If ActualizarBorraDatosEvt(numInstrumento, sw) = False Then
                sMsgError = "No se encontraron eventos para este instrumento"
                Return False
                Exit Function
            End If

            Dim i As Integer

            For i = 0 To flujos.Count - 1


                If i = 0 Then
                    fechaFlujoAux = DateTime.Parse(flujos(i).Fecha)
                    'fechaFlujoAux =  new Date(flujos(i).Fecha.Substring(0,4),flujos(i).Fecha.Substring(5,2),flujos(i).Fecha.Substring(8,2)) 
                    CalcBgDates = fechaFlujoAux.AddDays(-Convert.ToInt32(flujos(0).Periodo)).ToString("dd-MM-yyyy")
                Else
                    'fechaFlujoAux =  new Date(flujos(i-1).Fecha.Substring(0,4),flujos(i-1).Fecha.Substring(5,2),flujos(i-1).Fecha.Substring(8,2)) 
                    fechaFlujoAux = DateTime.Parse(flujos(i - 1).Fecha)
                    CalcBgDates = fechaFlujoAux.ToString("dd-MM-yyyy")
                End If

                fechaFlujoAux = DateTime.Parse(flujos(i).Fecha)
                'fechaFlujoAux =  new Date(flujos(i).Fecha.Substring(0,4),flujos(i).Fecha.Substring(5,2),flujos(i).Fecha.Substring(8,2)) 
                fechaFlujo = fechaFlujoAux.ToString("dd-MM-yyyy")




                If IsNumeric(flujos(i).Dias) Then

                    If Convert.ToInt32(flujos(i).Dias) > 0 Then

                        If razones.RateTyp.Trim.Equals("F") Then

                            If (Not flujos(i).Settlement.Equals("")) And moneda.Equals("UDI") Then

                                lineaInteres = "IC.=" & numInstrumento & ",EvtCtraT=COUPAY,EvtDaT=C,EvtDa=" & fechaFlujo & ",EvtEndDa=" & fechaFlujo & ",EvtCSttlDa=" & flujos(i).Settlement & ",EvtCalcBgDa=" & CalcBgDates & ",EvtDaysNb=" & flujos(i).Periodo & ", EvtUGrosA=" & flujos(i).Intereses & ",EvtUNetA=" & flujos(i).Intereses & ",EvtRT=" & razones.RateTyp & ",EvtIxC=" & razones.NominalRate.ToString & ",EvtBasisCod=360,EvtProb=1,EvtLsiz=1,EvtBalF=N,EvtFactor=1"

                            Else

                                lineaInteres = "IC.=" & numInstrumento & ",EvtCtraT=COUPAY,EvtDaT=C,EvtDa=" & fechaFlujo & ",EvtEndDa=" & fechaFlujo & ",EvtCalcBgDa=" & CalcBgDates & ",EvtDaysNb=" & flujos(i).Periodo & ", EvtUGrosA=" & flujos(i).Intereses & ",EvtUNetA=" & flujos(i).Intereses & ",EvtRT=" & razones.RateTyp & ",EvtIxC=" & razones.NominalRate.ToString & ",EvtBasisCod=360,EvtProb=1,EvtLsiz=1,EvtBalF=N,EvtFactor=1"

                            End If

                            sw.WriteLine(lineaInteres)


                        ElseIf razones.RateTyp.Trim.Equals("R") Or razones.RateTyp.Trim.Equals("V") Then

                            If (Not flujos(i).Settlement.Equals("")) And moneda.Equals("UDI") Then

                                lineaInteres = "IC.=" & numInstrumento & ",EvtCtraT=COUPAY,EvtDaT=C,EvtDa=" & fechaFlujo & ",EvtEndDa=" & fechaFlujo & ",EvtCSttlDa=" & flujos(i).Settlement & ",EvtCalcBgDa=" & CalcBgDates & ",EvtDaysNb=" & flujos(i).Periodo & ", EvtUGrosA=" & flujos(i).Intereses & ",EvtUNetA=" & flujos(i).Intereses & ",EvtRT=" & razones.RateTyp & ",EvtIdxCod=" & razones.RecvIdxCod.ToString() & ",EvtMarginAdd=" & razones.RecvMarginAdd.ToString() & ",EvtValueDat=" & fechaFlujo & ",EvtBasisCod=360,EvtProb=1,EvtLsiz=1,EvtBalF=N,EvtMarginMult=1,EvtFactor=1"

                            Else

                                lineaInteres = "IC.=" & numInstrumento & ",EvtCtraT=COUPAY,EvtDaT=C,EvtDa=" & fechaFlujo & ",EvtEndDa=" & fechaFlujo & ",EvtCalcBgDa=" & CalcBgDates & ",EvtDaysNb=" & flujos(i).Periodo & ", EvtUGrosA=" & flujos(i).Intereses & ",EvtUNetA=" & flujos(i).Intereses & ",EvtRT=" & razones.RateTyp & ",EvtIdxCod=" & razones.RecvIdxCod.ToString() & ",EvtMarginAdd=" & razones.RecvMarginAdd.ToString() & ",EvtValueDat=" & fechaFlujo & ",EvtBasisCod=360,EvtProb=1,EvtLsiz=1,EvtBalF=N,EvtMarginMult=1,EvtFactor=1"

                            End If

                            sw.WriteLine(lineaInteres)
                        End If



                        If IsNumeric(flujos(i).Amortizacion) And (i + 1) <= (flujos.Count - 1) Then

                            If Convert.ToInt32(flujos(i).Amortizacion) <> 0 And IsNumeric(flujos(i + 1).Dias) Then

                                If (Not flujos(i).Settlement.Equals("")) And moneda.Equals("UDI") Then

                                    lineaReduccion = "IC.=" & numInstrumento & ",EvtT=REDUCCIN,EvtDaT=C,EvtDa=" & fechaFlujo & ",EvtEndDa=" & fechaFlujo & ",EvtCSttlDa=" & flujos(i).Settlement & ",EvtCalcBgDa=" & CalcBgDates & ",EvtDaysNb=" & flujos(i).Periodo & ", EvtUGrosA=" & flujos(i).Amortizacion & ",EvtUNetA=" & flujos(i).Amortizacion & ",EvtFacvI=" & flujos(i + 1).ValorNominal & ",EvtProb=1,EvtLsiz=1,EvtBalF=N,EvtMarginMult=1,EvtFactor=1,EvtBasisCod=360,EvtRT=F"

                                Else

                                    lineaReduccion = "IC.=" & numInstrumento & ",EvtT=REDUCCIN,EvtDaT=C,EvtDa=" & fechaFlujo & ",EvtEndDa=" & fechaFlujo & ",EvtCalcBgDa=" & CalcBgDates & ",EvtDaysNb=" & flujos(i).Periodo & ", EvtUGrosA=" & flujos(i).Amortizacion & ",EvtUNetA=" & flujos(i).Amortizacion & ",EvtFacvI=" & flujos(i + 1).ValorNominal & ",EvtProb=1,EvtLsiz=1,EvtBalF=N,EvtMarginMult=1,EvtFactor=1,EvtBasisCod=360,EvtRT=F"

                                End If

                                sw.WriteLine(lineaReduccion)
                            End If


                        End If



                    End If

                End If


            Next


            'RATIFICAR CON EL USUARIO ESTA VALIDACIÓN
            fechaFlujoAux = DateTime.Parse(flujos(flujos.Count - 1).Fecha) ' new Date(flujos(flujos.Count - 1).Fecha.Substring(0,4),flujos(flujos.Count - 1).Fecha.Substring(5,2),flujos(flujos.Count - 1).Fecha.Substring(8,2)) 
            fechaFlujo = fechaFlujoAux.ToString("dd-MM-yyyy")
            CalcBgDates = fechaFlujo


            lineaRedem = "IC.=" & numInstrumento & ",EvtCtraT=BONDRED,EvtDaT=C,EvtDa=" & fechaFlujo & ",EvtCalcBgDa=" & CalcBgDates & ",EvtDaysNb=" & flujos(flujos.Count - 1).Periodo & ", EvtUGrosA=" & flujos(flujos.Count - 1).ValorNominal & ",EvtUNetA=" & flujos(flujos.Count - 1).ValorNominal & ",EvtProb=1,EvtFactor=1,EvtBasisCod=360,EvtRT=F"

            sw.WriteLine(lineaRedem)


            Return True

        Catch ex As Exception
            sMsgError = ex.Message
            Return False
        End Try



    End Function

    Public Function ActualizarBorraDatosEvt(ByVal numInstrumento As Integer, ByRef sw As StreamWriter) As Boolean
        Dim dt As datatable
        Dim lineaEvt As String

        Try
            dt = CServiciosMacrosSyBaseDB.ObtienerDatosEvt(numInstrumento)

            If dt Is Nothing Then
                Return False
            End If
            If dt.Rows.Count = 0 Then
                Return False
            End If

            For Each registro As DataRow In dt.Rows
                lineaEvt = "IC.=" & numInstrumento & ",EvtNr=" & registro("EVT_NUM") & ",EvtNat=D"
                sw.WriteLine(lineaEvt)
            Next

            dt.Clear()

            Return True

        Catch ex As Exception
            Return False
        End Try


    End Function

    Public Sub EjecutarProceso(ByRef NomArchivo As String)
        Dim servGrales As New CServiciosGenerales()

        Try
            servGrales.EjecutarProceso(RUTA & COMANDO, PARAMETROS & RUTA & NomArchivo, "Valmer")


        Catch ex As Exception

        End Try

    End Sub

    Public Function ConstruirArchivoValmerDecalogRV(ByRef listaRV As List(Of CTConciliaCupones), ByRef NomArchivo As String, ByRef sMsgError As String) As Boolean
        Try
            NomArchivo = NOMBREARCHIVO & "_DIV_" & Date.Now.ToString("yyyyMMdd") & "_" & Date.Now.ToString("hhmmss")
            Using sw As StreamWriter = File.CreateText(RUTA & NomArchivo)
                sw.WriteLine(ENCABEZADO)
                For Each cupon As CTConciliaCupones In listaRV
                    If cupon.EvtNum <> 0 And cupon.FechaDecalogS = cupon.FechaSugeridaS Then
                        sw.WriteLine("IC.=" & cupon.InstNum & ",EvtNr=" & cupon.EvtNum & ",EvtNat=D")
                    End If
                    sw.WriteLine("IC.=" & cupon.InstNum & ",EvtT=BBVDIVC,EvtNat=C,EvtCtraT=DIVREC,EvtLsiz=0," _
                                 & "EvtUGrosA=" & cupon.Factor.ToString("#0.000000000") & ",EvtUNetA=0,EvtTaxCred=0," _
                                 & "EvtTaxWhld=0,EvtProb=1,EvtCurC=" & cupon.CurCod & ",EvtIxC=0,EvtFracT=1,EvtBalF=N," _
                                 & "EvtFacvI=0,EvtDa=" & cupon.FechaExcupon.ToString("dd-MM-yyyy") & ",EvtDaT=X," _
                                 & "EvtEndDa=" & cupon.FechaSugerida.ToString("dd-MM-yyyy") & ",EvtISttlDa=" & cupon.FechaSugerida.ToString("dd-MM-yyyy") & "," _
                                 & "EvtCSttlDa=" & cupon.FechaSugerida.ToString("dd-MM-yyyy") & ",EvtFactor=0,EvtTID=0")
                Next

                sw.Close()
            End Using

            Return True

        Catch ex As Exception
            sMsgError = ex.Message
            Return False
        End Try

    End Function
#End Region

End Class
